#include<bits/stdc++.h>
using namespace std;

struct car{
	double d,v,a;
}ca[100005];

int p[100005];
int pn[100005];
bool vis[100005];

int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		int n,m,l,v;
		int ans1=0,ans2=0;
		cin>>n>>m>>l>>v;
		for(int i=1;i<=n;i++)
		{
			cin>>ca[i].d>>ca[i].v>>ca[i].a;
		}
		for(int i=1;i<=m;i++)
		{int x;cin>>x;p[x]++;}
		for(int i=1;i<=m;i++)p[i]+=p[i-1];
		for(int i=1;i<=n;i++)
		{	
			bool flag=false;
			if(ca[i].a>0)
			{
				double left=ca[i].d+(v*v-ca[i].v*ca[i].v)/(2*ca[i].a),right=l;
				if(p[(int)right]-p[(int)left-1]>0)
				{
					ans1++;
					for(int i=left;i<=right;i++)
					{
						if(vis[i])
						{
							flag=false;break;
						}
						vis[i]=true;
					}
					if(flag)ans2++;
				}
			}
			else if(ca[i].a==0)
			{
				if(ca[i].v>v){ans1++;ans2=max(1,ans2);}
			}
			else
			{
				double left=ca[i].d,right=ca[i].d+(v*v-ca[i].v*ca[i].v)/(2*ca[i].a);
				if(p[(int)right]-p[(int)left-1]>0)
				{
					ans1++;
					for(int i=left;i<=right;i++)
					{
						if(vis[i])
						{
							flag=false;break;
						}
						vis[i]=true;
					}
					if(flag)ans2++;
				}
			}
		}
		cout<<ans1<<' '<<ans2<<endl;
	}
	return 0;
}
